Splash的简单使用 和 服务压力测试 - CSDN博客

创建时间:2018/3/2 17:04
来源:http://blog.csdn.net/u013055678/article/details/58735626


Splash的简单使用 和 服务压力测试

mac 安装
先安装docker
一路默认安装直到让你选择Docker Quickstart Terminal还是Kitematic ,选择docker
会自动默认安装,继续就ok了

验证是否成功:
docker-machine start default
docker-machine ssh default

连接到docker以后输入echo “hello world",显示出hello world,说明ok

安装splash
安装命令:docker pull scrapinghub/splash
启动命令:docker run -p 5023:5023 -p 8050:8050 -p 8051:8051 scrapinghub/splash
8050 (http),8051 (https) ,5023 (telnet)






查看ip
docker-machine ip default




浏览器访问ip加8050端口,页面出现说明成功

splash使用:
使用lua脚本,需要一个main函数

简单实现:
[plain] view plain copy
  1. function main(splash)  
  2.     splash:go("http://www.baidu.com")  
  3.     splash:wait(0.5)  
  4.     return {c=splash:get_cookies()}  
  5. end  
获得百度页面的cookies,有些网站会在页面用js生成各种cookie用来加大爬虫难度

python调用方法:
[python] view plain copy
  1. # -*-coding:utf-8 -*-  
  2. __author__ = "ayou"  
  3.   
  4. import requests  
  5. import json  
  6.   
  7. s = requests.session()  
  8. #execute是执行脚本  
  9. #脚本为lu,也可以使用js脚本  
  10. url="http://192.168.99.100:8050/execute?lua_source="  
  11. #以下脚本为访问百度,并返回cookies  
  12. script = ''''' 
  13. function main(splash) 
  14.     splash:go("http://www.baidu.com") 
  15.     splash:wait(0.5) 
  16.     return {c=splash:get_cookies()} 
  17. end 
  18. '''  
  19. cc={}  
  20. r = s.get(url+script)  
  21. a = str(r.content, encoding = "utf-8")  
  22. jsondata = json.loads(a)  
  23. for line in jsondata["c"]:  
  24.     cc[line["name"]]= line["value"]  
  25. print(cc)  
splash的execute是用来执行lua脚本,返回一段json,里面就是百度cookies


通过代理ip访问:
[python] view plain copy
  1. # -*-coding:utf-8 -*-  
  2. __author__ = "ayou"  
  3.   
  4. import requests  
  5.   
  6. s = requests.session()  
  7. #execute是执行脚本  
  8. #脚本为lu,也可以使用js脚本  
  9. url="http://192.168.99.100:8050/execute?lua_source="  
  10. #以下代码是通过代理ip访问  
  11. script_1=''''' 
  12. function main(splash) 
  13.     splash:on_request(function(request) 
  14.         request:set_proxy{ 
  15.         host = "60.21.132.218", 
  16.         port = 63000, 
  17.     } 
  18.     end) 
  19.     assert(splash:go("http://1212.ip138.com/ic.asp")) 
  20.     return splash:html() 
  21. end 
  22. '''  
  23. r = s.get(url+script_1)  
  24. a = str(r.content, encoding = "utf-8")  
  25. print(a)  
结果:


这是西刺上的一个免费代理ip

Splash支持lua脚本和js脚本,还支持在线脚本测试,并附带简单的函数提示说明



关闭splash :
先用 docker ps 命令找出splash的CONTAINER ID
然后用 docker stop 7b1f1412e7dc(CONTAINER ID) 命令关闭


Splash作为服务可以提供给各种语言使用

Splash文档:http://splash.readthedocs.io/en/latest/install.html

Splash文档(英文)很完整,用法很丰富,仔细看会有很多惊喜

因为只用了一天Splash,还没法用它和selenium+PhantomJS比较哪个方式更稳定快速,不过目前觉得它是一个神器,貌似用得人挺少,可惜


对splash进行了压力测试:
使用了siege
系统为macos sierra 10.12.3
测试命令:
siege -c 200 -r 5 http://192.168.99.100:8050/execute?lua_source=function+main%28splash%29%0D%0A++++splash%3Ago%28%22http%3A%2F%2Fwww.baidu.com%22%29%0D%0A++++splash%3Await%280.5%29%0D%0A++++return+%7Bc%3Dsplash%3Aget_cookies%28%29%7D%0D%0Aend
结果:


添加 nginx,参考: flask笔记:11:gunicorn+gevent+nginx+flask部署,使用siege进行服务器压力测试
打开nginx.conf 修改:
location @pp {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            #修改成splash地址
            proxy_pass http://192.168.99.100:8050;
        }

重启nginx:sudo /usr/local/nginx/sbin/nginx -s reload

测试命令:
siege -c 200 -r 5 http://127.0.0.1:8088/execute?lua_source=function+main%28splash%29%0D%0A++++splash%3Ago%28%22http%3A%2F%2Fwww.baidu.com%22%29%0D%0A++++splash%3Await%280.5%29%0D%0A++++return+%7Bc%3Dsplash%3Aget_cookies%28%29%7D%0D%0Aend
结果:



公司用selenium+PhantomJS处理一些复杂网站封装成服务,但是不太稳定,PhantomJS好像释放内存有问题,爆过几次服务器内存,从上面的结果和我这两天用Splash的感受觉得Splash比selenium+PhantomJS的模式更适合做成服务式的爬虫服务


关于siege请参看: flask笔记:11:gunicorn+gevent+nginx+flask部署,使用siege进行服务器压力测试